<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge" >
  <link rel="dns-prefetch" href="https://ZhenshengLee.github.io">
  <title>ROSCpp-ROS线程模型 | 哈骑士的博客</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="前言
roscpp_overview详细解读">
<meta property="og:type" content="article">
<meta property="og:title" content="ROSCpp-ROS线程模型">
<meta property="og:url" content="https://ZhenshengLee.github.io/2017/01/03/170103-ROSCpp/index.html">
<meta property="og:site_name" content="哈骑士的博客">
<meta property="og:description" content="前言
roscpp_overview详细解读">
<meta property="og:updated_time" content="2017-01-03T15:40:35.809Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="ROSCpp-ROS线程模型">
<meta name="twitter:description" content="前言
roscpp_overview详细解读">
  
    <link rel="alternative" href="/atom.xml" title="哈骑士的博客" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  <link rel="stylesheet" type="text/css" href="/main.68ab53.css">
  <style type="text/css">
  
    #container.show {
      background: linear-gradient(200deg,#a0cfe4,#e8c37e);
    }
  </style>
  

  

</head>

<body>
  <div id="container" q-class="show:isCtnShow">
    <canvas id="anm-canvas" class="anm-canvas"></canvas>
    <div class="left-col" q-class="show:isShow">
      
<div class="overlay" style="background: #4d4d4d"></div>
<div class="intrude-less">
	<header id="header" class="inner">
		<a href="/" class="profilepic">
			<img src="http://7xvunf.com1.z0.glb.clouddn.com/%E5%85%B6%E4%BB%96100.jpg" class="js-avatar">
		</a>
		<hgroup>
		  <h1 class="header-author"><a href="/">黎振胜</a></h1>
		</hgroup>
		
		<p class="header-subtitle">将科技固化为产品——机器人软件开发</p>
		

		<nav class="header-menu">
			<ul>
			
				<li><a href="/">主页</a></li>
	        
				<li><a href="/tags/机器人/">机器人</a></li>
	        
				<li><a href="/tags/嵌入式/">嵌入式</a></li>
	        
				<li><a href="/tags/其他/">其他</a></li>
	        
			</ul>
		</nav>
		<nav class="header-smart-menu">
    		
    			
    			<a q-on="click: openSlider(e, 'innerArchive')" href="javascript:void(0)">所有文章</a>
    			
            
    			
            
    			
    			<a q-on="click: openSlider(e, 'aboutme')" href="javascript:void(0)">关于我</a>
    			
            
		</nav>
		<nav class="header-nav">
			<div class="social">
				
					<a class="github" target="_blank" href="https://github.com/ZhenshengLee" title="github"><i class="icon-github"></i></a>
		        
					<a class="mail" target="_blank" href="mailto://lzs_1993@qq.com" title="mail"><i class="icon-mail"></i></a>
		        
					<a class="linkedin" target="_blank" href="https://cn.linkedin.com/in/zhenshengli" title="linkedin"><i class="icon-linkedin"></i></a>
		        
			</div>
		</nav>
	</header>		
</div>

    </div>
    <div class="mid-col" q-class="show:isShow,hide:isShow|isFalse">
      
<nav id="mobile-nav">
  	<div class="overlay js-overlay" style="background: #4d4d4d"></div>
	<div class="btnctn js-mobile-btnctn">
  		<div class="slider-trigger list" q-on="click: openSlider(e)"><i class="icon icon-sort"></i></div>
	</div>
	<div class="intrude-less">
		<header id="header" class="inner">
			<div class="profilepic">
				<img src="http://7xvunf.com1.z0.glb.clouddn.com/%E5%85%B6%E4%BB%96100.jpg" class="js-avatar">
			</div>
			<hgroup>
			  <h1 class="header-author js-header-author">黎振胜</h1>
			</hgroup>
			
			<p class="header-subtitle"><i class="icon icon-quo-left"></i>将科技固化为产品——机器人软件开发<i class="icon icon-quo-right"></i></p>
			
			
			
				
			
				
			
				
			
				
			
			
			
			<nav class="header-nav">
				<div class="social">
					
						<a class="github" target="_blank" href="https://github.com/ZhenshengLee" title="github"><i class="icon-github"></i></a>
			        
						<a class="mail" target="_blank" href="mailto://lzs_1993@qq.com" title="mail"><i class="icon-mail"></i></a>
			        
						<a class="linkedin" target="_blank" href="https://cn.linkedin.com/in/zhenshengli" title="linkedin"><i class="icon-linkedin"></i></a>
			        
				</div>
			</nav>

			<nav class="header-menu js-header-menu">
				<ul style="width: 70%">
				
				
					<li style="width: 25%"><a href="/">主页</a></li>
		        
					<li style="width: 25%"><a href="/tags/机器人/">机器人</a></li>
		        
					<li style="width: 25%"><a href="/tags/嵌入式/">嵌入式</a></li>
		        
					<li style="width: 25%"><a href="/tags/其他/">其他</a></li>
		        
				</ul>
			</nav>
		</header>				
	</div>
	<div class="mobile-mask" style="display:none" q-show="isShow"></div>
</nav>

      <div id="wrapper" class="body-wrap">
        <div class="menu-l">
          <div class="canvas-wrap">
            <canvas data-colors="#eaeaea" data-sectionHeight="100" data-contentId="js-content" id="myCanvas1" class="anm-canvas"></canvas>
          </div>
          <div id="js-content" class="content-ll">
            <article id="post-170103-ROSCpp" class="article article-type-post " itemscope itemprop="blogPost">
  <div class="article-inner">
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      ROSCpp-ROS线程模型
    </h1>
  

        
        <a href="/2017/01/03/170103-ROSCpp/" class="archive-article-date">
  	<time datetime="2017-01-03T15:40:35.809Z" itemprop="datePublished"><i class="icon-calendar icon"></i>2017-01-03</time>
</a>
        
      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h2 id="&#x524D;&#x8A00;"><a href="#&#x524D;&#x8A00;" class="headerlink" title="&#x524D;&#x8A00;"></a>&#x524D;&#x8A00;</h2><ul>
<li>roscpp_overview&#x8BE6;&#x7EC6;&#x89E3;&#x8BFB;</li>
</ul>
<a id="more"></a>
<h2 id="&#x76EE;&#x5F55;"><a href="#&#x76EE;&#x5F55;" class="headerlink" title="&#x76EE;&#x5F55;"></a>&#x76EE;&#x5F55;</h2><!-- toc -->
<ul>
<li><a href="#&#x53C2;&#x8003;">&#x53C2;&#x8003;</a></li>
<li><a href="#&#x524D;&#x8A00;">&#x524D;&#x8A00;</a><ul>
<li><a href="#&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x591A;&#x7EBF;&#x7A0B;">&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x591A;&#x7EBF;&#x7A0B;&#xFF1F;</a></li>
</ul>
</li>
<li><a href="#&#x5B66;&#x4E60;&#x8BB0;&#x5F55;">&#x5B66;&#x4E60;&#x8BB0;&#x5F55;</a><ul>
<li><a href="#callbacks-and-spinning">Callbacks and Spinning</a><ul>
<li><a href="#ros&#x5185;&#x90E8;&#x7684;&#x7EBF;&#x7A0B;&#x6A21;&#x578B;">ROS&#x5185;&#x90E8;&#x7684;&#x7EBF;&#x7A0B;&#x6A21;&#x578B;</a></li>
<li><a href="#&#x5355;&#x7EBF;&#x7A0B;spinning">&#x5355;&#x7EBF;&#x7A0B;Spinning</a></li>
<li><a href="#&#x591A;&#x7EBF;&#x7A0B;spinning">&#x591A;&#x7EBF;&#x7A0B;Spinning</a></li>
<li><a href="#&#x9AD8;&#x7EA7;&#x4F7F;&#x7528;&#x591A;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x961F;&#x5217;">&#x9AD8;&#x7EA7;&#xFF1A;&#x4F7F;&#x7528;&#x591A;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x961F;&#x5217;</a></li>
</ul>
</li>
<li><a href="#&#x603B;&#x7ED3;">&#x603B;&#x7ED3;</a><ul>
<li><a href="#&#x539F;&#x7406;&#x603B;&#x7ED3;">&#x539F;&#x7406;&#x603B;&#x7ED3;</a></li>
<li><a href="#&#x591A;&#x7EBF;&#x7A0B;&#x4F7F;&#x7528;">&#x591A;&#x7EBF;&#x7A0B;&#x4F7F;&#x7528;</a></li>
</ul>
</li>
<li><a href="#&#x7A0B;&#x5E8F;&#x793A;&#x4F8B;">&#x7A0B;&#x5E8F;&#x793A;&#x4F8B;</a></li>
<li><a href="#&#x5E16;&#x5B50;&#x7B54;&#x6848;">&#x5E16;&#x5B50;&#x7B54;&#x6848;</a><ul>
<li><a href="#the-theory">The theory</a></li>
<li><a href="#your-case">Your case</a></li>
<li><a href="#conclusion">Conclusion</a></li>
<li><a href="#proposed-solution">Proposed solution</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<!-- tocstop -->
<h2 id="&#x53C2;&#x8003;"><a href="#&#x53C2;&#x8003;" class="headerlink" title="&#x53C2;&#x8003;"></a>&#x53C2;&#x8003;</h2><ul>
<li><p><a href="http://wiki.ros.org/roscpp/Overview/Initialization%20and%20Shutdown" target="_blank" rel="external">roscpp wiki</a></p>
</li>
<li><p><a href="">ROS callbacks, threads, and spinning</a></p>
</li>
</ul>
<h2 id="&#x524D;&#x8A00;"><a href="#&#x524D;&#x8A00;-1" class="headerlink" title="&#x524D;&#x8A00;"></a>&#x524D;&#x8A00;</h2><ul>
<li>&#x5F88;&#x591A;&#x6A21;&#x5757;&#xFF0C;&#x6BD4;&#x8F83;&#x57FA;&#x7840;&#x7684;&#x6A21;&#x5757;&#x9700;&#x8981;&#x6DF1;&#x5165;&#x7406;&#x89E3;</li>
<li>&#x6709;&#x4E00;&#x4E9B;&#x5173;&#x4E8E;&#x591A;&#x7EBF;&#x7A0B;&#x7F16;&#x7A0B;&#x7684;&#x77E5;&#x8BC6;&#x9700;&#x8981;&#x77E5;&#x9053;</li>
<li>&#x4E3B;&#x8981;&#x5B66;&#x4E60;&#x4E00;&#x4E0B;&#x6A21;&#x5757;&#x7684;&#x5185;&#x90E8;&#x673A;&#x7406;<ul>
<li>Callbacks and Spinning</li>
<li>Publishers and Subscribers</li>
<li>Timers</li>
<li>NodeHandles</li>
<li>Logging</li>
<li>Time</li>
<li>CppStyleGuide</li>
</ul>
</li>
</ul>
<h3 id="&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x591A;&#x7EBF;&#x7A0B;"><a href="#&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x591A;&#x7EBF;&#x7A0B;&#xFF1F;" class="headerlink" title="&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x591A;&#x7EBF;&#x7A0B;&#xFF1F;"></a>&#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981;&#x591A;&#x7EBF;&#x7A0B;&#xFF1F;</h3><ul>
<li>&#x6BD4;&#x5982;&#x8BF4;&#xFF0C;ROS&#x9700;&#x8981;&#x63A5;&#x53D7;&#x76F8;&#x673A;&#x4F20;&#x6765;&#x7684;&#x70B9;&#x4E91;&#xFF0C;&#x5E76;&#x4E14;&#x68C0;&#x6D4B;&#x5E73;&#x9762;&#xFF0C;&#x5F97;&#x5230;&#x6CD5;&#x5411;&#x91CF;&#xFF0C;&#x663E;&#x793A;&#x5728;RViz&#x4E0A;&#xFF0C;&#x8FD9;&#x6837;&#x9700;&#x8981;&#x8BA2;&#x9605;sensormsgs::point2&#x6D88;&#x606F;&#x5E76;&#x4E14;&#x6CE8;&#x518C;&#x70B9;&#x4E91;&#x5904;&#x7406;&#x51FD;&#x6570;foo()&#xFF0C;&#x7531;&#x4E8E;&#x70B9;&#x4E91;&#x5904;&#x7406;&#x51FD;&#x6570;&#x9700;&#x8981;&#x8F83;&#x957F;&#x65F6;&#x95F4;&#x6267;&#x884C;&#xFF0C;&#x6240;&#x4EE5;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x591A;&#x7EBF;&#x7A0B;&#xFF08;&#x662F;&#x5355;&#x7EBF;&#x7A0B;spin&#xFF09;&#xFF0C;&#x5219;&#x5728;&#x63A5;&#x6536;&#x5230;&#x4E00;&#x4E2A;&#x70B9;&#x4E91;&#x6D88;&#x606F;&#x6570;&#x636E;&#x540E;&#xFF0C;&#x8BA2;&#x9605;&#x51FD;&#x6570;&#x4F1A;&#x963B;&#x585E;&#xFF0C;&#x4F1A;&#x4E00;&#x76F4;&#x6267;&#x884C;&#x5904;&#x7406;&#x51FD;&#x6570;&#xFF0C;&#x4E0D;&#x4F1A;&#x63A5;&#x6536;&#x5230;&#x4E0B;&#x4E00;&#x4E2A;&#x70B9;&#x4E91;&#x6D88;&#x606F;&#xFF0C;&#x6B64;&#x65F6;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x5B9A;&#x4E49;&#x6D88;&#x606F;&#x63A5;&#x6536;&#x961F;&#x5217;&#xFF0C;&#x5219;&#x70B9;&#x4E91;&#x6570;&#x636E;&#x4F1A;&#x88AB;&#x4E22;&#x5F03;&#xFF0C;&#x5728;RViz&#x663E;&#x793A;&#x4E0A;&#x4E5F;&#x4F1A;&#x5F88;&#x5361;&#x987F;&#x3002;</li>
</ul>
<h2 id="&#x5B66;&#x4E60;&#x8BB0;&#x5F55;"><a href="#&#x5B66;&#x4E60;&#x8BB0;&#x5F55;" class="headerlink" title="&#x5B66;&#x4E60;&#x8BB0;&#x5F55;"></a>&#x5B66;&#x4E60;&#x8BB0;&#x5F55;</h2><h3 id="callbacks-and-spinning"><a href="#Callbacks-and-Spinning" class="headerlink" title="Callbacks and Spinning"></a>Callbacks and Spinning</h3><h4 id="ros&#x5185;&#x90E8;&#x7684;&#x7EBF;&#x7A0B;&#x6A21;&#x578B;"><a href="#ROS&#x5185;&#x90E8;&#x7684;&#x7EBF;&#x7A0B;&#x6A21;&#x578B;" class="headerlink" title="ROS&#x5185;&#x90E8;&#x7684;&#x7EBF;&#x7A0B;&#x6A21;&#x578B;"></a>ROS&#x5185;&#x90E8;&#x7684;&#x7EBF;&#x7A0B;&#x6A21;&#x578B;</h4><ul>
<li>roscpp&#x5E76;&#x4E0D;&#x628A;&#x7EBF;&#x7A0B;&#x6A21;&#x578B;&#x66B4;&#x9732;&#x7ED9;&#x7A0B;&#x5E8F;&#x5458;&#xFF0C;&#x8FD9;&#x610F;&#x5473;&#x7740;&#xFF0C;&#x5728;&#x4EE3;&#x7801;&#x80CC;&#x540E;&#xFF0C;&#x7A0B;&#x5E8F;&#x5176;&#x5B9E;&#x6709;&#x5F88;&#x591A;&#x7EBF;&#x7A0B;&#x5728;&#x8FD0;&#x884C;&#xFF0C;&#x6BD4;&#x5982;&#x7F51;&#x7EDC;&#x7BA1;&#x7406;&#xFF0C;&#x4EFB;&#x52A1;&#x8C03;&#x5EA6;&#x7B49;&#x3002;</li>
<li>&#x4F46;&#x662F;roscpp&#x5374;&#x5141;&#x8BB8;&#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x591A;&#x7EBF;&#x7A0B;&#x6765;&#x8C03;&#x7528;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF0C;&#x8FD9;&#x53C8;&#x610F;&#x5473;&#x7740;&#x4F60;&#x5FC5;&#x987B;&#x5199;&#x4E00;&#x53E5;ros::spin()&#x6765;&#x4F7F;&#x5F97;&#x5176;&#x53EF;&#x4EE5;&#x88AB;&#x8C03;&#x7528;<blockquote>
<p>They will have an effect on the subscription queue, since how fast you process your callbacks and how quickly messages are arriving determines whether or not messages will be dropped.</p>
</blockquote>
</li>
</ul>
<h4 id="&#x5355;&#x7EBF;&#x7A0B;spinning"><a href="#&#x5355;&#x7EBF;&#x7A0B;Spinning" class="headerlink" title="&#x5355;&#x7EBF;&#x7A0B;Spinning"></a>&#x5355;&#x7EBF;&#x7A0B;Spinning</h4><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">ros::init(argc, argv, <span class="string">&quot;my_node&quot;</span>);</span><br><span class="line">ros::NodeHandle nh;</span><br><span class="line">ros::Subscriber sub = nh.subscribe(...);</span><br><span class="line">...</span><br><span class="line">ros::spin();<span class="comment">//&#x5982;&#x679C;&#x4E0D;Ctrl+C&#x6216;&#x8005;&#x51FA;&#x73B0;&#x5F02;&#x5E38;&#xFF0C;&#x8FD9;&#x4E2A;&#x5FAA;&#x73AF;&#x4E0D;&#x4F1A;&#x7ED3;&#x675F;</span></span><br><span class="line">ros::<span class="function">Rate <span class="title">r</span><span class="params">(<span class="number">10</span>)</span></span>; <span class="comment">// 10 hz</span></span><br><span class="line"><span class="keyword">while</span> (should_continue)</span><br><span class="line">{</span><br><span class="line">  ... <span class="keyword">do</span> some work, publish some messages, etc. ...</span><br><span class="line">  ros::spinOnce();</span><br><span class="line">  r.sleep();</span><br><span class="line">}<span class="comment">//&#x8FD9;&#x4E2A;&#x5FAA;&#x73AF;&#x4F9D;&#x7136;&#x4E0D;&#x4F1A;&#x7ED3;&#x675F;&#x4E0D;&#x662F;&#x4E48;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;ros/callback_queue.h&gt;</span></span></span><br><span class="line">ros::NodeHandle n;</span><br><span class="line"><span class="keyword">while</span> (ros::ok())</span><br><span class="line">{</span><br><span class="line">  ros::getGlobalCallbackQueue()-&gt;callAvailable(ros::WallDuration(<span class="number">0.1</span>));<span class="comment">//&#x4ECE;&#x4E00;&#x4E2A;&#x5168;&#x5C40;&#x961F;&#x5217;&#x4E2D;&#x53D6;&#x51FA;</span></span><br><span class="line">}</span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;ros/callback_queue.h&gt;</span></span></span><br><span class="line"></span><br><span class="line">ros::getGlobalCallbackQueue()-&gt;callAvailable(ros::WallDuration(<span class="number">0</span>));</span><br></pre></td></tr></table></figure>
<h4 id="&#x591A;&#x7EBF;&#x7A0B;spinning"><a href="#&#x591A;&#x7EBF;&#x7A0B;Spinning" class="headerlink" title="&#x591A;&#x7EBF;&#x7A0B;Spinning"></a>&#x591A;&#x7EBF;&#x7A0B;Spinning</h4><ul>
<li>&#x4ECE;&#x591A;&#x4E2A;&#x7EBF;&#x7A0B;&#x6765;&#x8C03;&#x7528;&#x56DE;&#x8C03;&#x51FD;&#x6570;</li>
<li>&#x5206;&#x963B;&#x585E;&#x578B;&#xFF08;&#x540C;&#x6B65;&#xFF09;&#x548C;&#x975E;&#x963B;&#x585E;&#x578B;&#xFF08;&#x5F02;&#x6B65;&#xFF09;&#xFF0C;&#x4E3B;&#x8981;&#x8868;&#x73B0;&#x4E3A;&#x662F;&#x5426;&#x963B;&#x585E;&#x8C03;&#x7528;&#x5B83;&#x7684;&#x4E3B;&#x8C03;&#x7EBF;&#x7A0B;</li>
</ul>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">ros::<span class="function">MultiThreadedSpinner <span class="title">spinner</span><span class="params">(<span class="number">4</span>)</span></span>; <span class="comment">// Use 4 threads</span></span><br><span class="line">spinner.spin(); <span class="comment">// spin() will not return until the node has been shutdown</span></span><br><span class="line"><span class="comment">//or</span></span><br><span class="line">ros::<span class="function">AsyncSpinner <span class="title">spinner</span><span class="params">(<span class="number">4</span>)</span></span>; <span class="comment">// Use 4 threads</span></span><br><span class="line">spinner.start();</span><br><span class="line">ros::waitForShutdown();</span><br></pre></td></tr></table></figure>
<h4 id="&#x9AD8;&#x7EA7;&#x4F7F;&#x7528;&#x591A;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x961F;&#x5217;"><a href="#&#x9AD8;&#x7EA7;&#xFF1A;&#x4F7F;&#x7528;&#x591A;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x961F;&#x5217;" class="headerlink" title="&#x9AD8;&#x7EA7;&#xFF1A;&#x4F7F;&#x7528;&#x591A;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x961F;&#x5217;"></a>&#x9AD8;&#x7EA7;&#xFF1A;&#x4F7F;&#x7528;&#x591A;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x961F;&#x5217;</h4><ul>
<li>&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x90FD;&#x5728;&#x4E00;&#x4E2A;&#x5168;&#x5C40;&#x961F;&#x5217;&#x91CC;&#x9762;&#xFF0C;&#x5728;&#x7279;&#x6B8A;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x53EF;&#x4EE5;&#x81EA;&#x5B9A;&#x4E49;&#x591A;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x961F;&#x5217;&#x4EE5;&#x63D0;&#x9AD8;&#x6027;&#x80FD;&#x3002;</li>
<li>&#x9002;&#x7528;&#x8303;&#x56F4;<ul>
<li>&#x957F;&#x65F6;&#x95F4;&#x8FD0;&#x884C;&#x7684;&#x670D;&#x52A1;</li>
<li>&#x8FD0;&#x884C;&#x7279;&#x522B;&#x8D39;&#x65F6;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;</li>
</ul>
</li>
</ul>
<h3 id="&#x603B;&#x7ED3;"><a href="#&#x603B;&#x7ED3;" class="headerlink" title="&#x603B;&#x7ED3;"></a>&#x603B;&#x7ED3;</h3><h4 id="&#x539F;&#x7406;&#x603B;&#x7ED3;"><a href="#&#x539F;&#x7406;&#x603B;&#x7ED3;" class="headerlink" title="&#x539F;&#x7406;&#x603B;&#x7ED3;"></a>&#x539F;&#x7406;&#x603B;&#x7ED3;</h4><ul>
<li>spin()&#x7684;&#x76EE;&#x7684;&#x662F;&#x542F;&#x52A8;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x7EBF;&#x7A0B;&#x53BB;&#x83B7;&#x53D6;&#x961F;&#x5217;&#x4E2D;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x5E76;&#x8C03;&#x7528;<ul>
<li>&#x5206;&#x5355;&#x7EBF;&#x7A0B;&#xFF0C;&#x540C;&#x6B65;&#x591A;&#x7EBF;&#x7A0B;&#x548C;&#x5F02;&#x6B65;&#x591A;&#x7EBF;&#x7A0B;&#xFF0C;&#x8FD9;&#x4E9B;&#x90FD;&#x6709;&#x5185;&#x7F6E;&#x7684;&#x8BED;&#x53E5;</li>
<li>&#x8FD8;&#x53EF;&#x4EE5;&#x81EA;&#x5B9A;&#x4E49;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x961F;&#x5217;</li>
</ul>
</li>
</ul>
<h4 id="&#x591A;&#x7EBF;&#x7A0B;&#x4F7F;&#x7528;"><a href="#&#x591A;&#x7EBF;&#x7A0B;&#x4F7F;&#x7528;" class="headerlink" title="&#x591A;&#x7EBF;&#x7A0B;&#x4F7F;&#x7528;"></a>&#x591A;&#x7EBF;&#x7A0B;&#x4F7F;&#x7528;</h4><ul>
<li>&#x975E;&#x5E38;&#x8017;&#x65F6;&#x7684;&#x8FD0;&#x7B97;&#x5EFA;&#x8BAE;&#x653E;&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;</li>
</ul>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span>(ros::ok())</span><br><span class="line">{ </span><br><span class="line">     leg_detector.process(latest_scan);</span><br><span class="line">     ros::spinOnce();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x5EFA;&#x8BAE;&#x653E;&#x7B80;&#x5355;&#x51FD;&#x6570;&#xFF0C;&#x6700;&#x591A;&#x653E;&#x6570;&#x636E;&#x590D;&#x5236;&#x51FD;&#x6570;</li>
</ul>
<h3 id="&#x7A0B;&#x5E8F;&#x793A;&#x4F8B;"><a href="#&#x7A0B;&#x5E8F;&#x793A;&#x4F8B;" class="headerlink" title="&#x7A0B;&#x5E8F;&#x793A;&#x4F8B;"></a>&#x7A0B;&#x5E8F;&#x793A;&#x4F8B;</h3><ul>
<li>&#x5EFA;&#x8BAE;&#x67E5;&#x770B; wall_extrator_pcl,cpp by Willow Garage Inc.</li>
<li>&#x8BE5;&#x7A0B;&#x5E8F;&#x63A5;&#x6536;&#x70B9;&#x4E91;&#x6570;&#x636E;&#x548C;&#x4E00;&#x4E2A;&#x68C0;&#x6D4B;&#x5899;&#x4F53;&#x7684;&#x670D;&#x52A1;&#xFF0C;&#x6709;&#x4E24;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;cloudCB()&#x548C;wall_detect()&#xFF0C;cloudCB()&#x7B80;&#x5355;&#x5730;&#x5C06;&#x70B9;&#x4E91;&#x6D88;&#x606F;&#x6307;&#x9488;&#x4F20;&#x9012;&#x7ED9;&#x7C7B;&#x7684;&#x79C1;&#x6709;&#x5E38;&#x91CF;&#x6307;&#x9488;&#xFF0C;&#x800C;&#x670D;&#x52A1;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6839;&#x636E;&#x9700;&#x8981;&#x6267;&#x884C;&#x68C0;&#x6D4B;&#x5899;&#x4F53;&#x529F;&#x80FD;&#xFF0C;&#x5411;RViz&#x53D1;&#x9001;Marker&#x6D88;&#x606F;&#x6807;&#x8BB0;&#x3002;</li>
<li>&#x8BE5;&#x7A0B;&#x5E8F;&#x5728;&#x4E3B;&#x7EBF;&#x7A0B;&#x4E2D;&#x4F7F;&#x7528;&#x4E86;&#x540C;&#x6B65;2&#x4E2A;&#x7EBF;&#x7A0B;spinner&#xFF0C;&#x4E24;&#x4E2A;&#x7EBF;&#x7A0B;&#x5206;&#x522B;&#x6267;&#x884C;&#x4E24;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#xFF08;&#x8868;&#x9762;&#x4E0A;&#x770B;&#x662F;&#x8FD9;&#x6837;&#x6CA1;&#x9519;&#xFF0C;&#x4F46;&#x5B9E;&#x9645;&#x4E0A;&#x8FD8;&#x5F97;&#x770B;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x8C03;&#x5EA6;&#xFF09;</li>
<li>&#x4E24;&#x4E2A;&#x7EBF;&#x7A0B;&#x95F4;&#x901A;&#x8FC7;&#x6761;&#x4EF6;&#x53D8;&#x91CF;&#x7ED3;&#x5408;&#x4E92;&#x65A5;&#x91CF;&#x6765;&#x5B9E;&#x73B0;&#x7EBF;&#x7A0B;&#x540C;&#x6B65;</li>
</ul>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">cloudCb</span><span class="params">(<span class="keyword">const</span> boost::<span class="built_in">shared_ptr</span>&lt;<span class="keyword">const</span> sensor_msgs::PointCloud2&gt;&amp; cloud)</span></span><br><span class="line">  </span>{</span><br><span class="line">    boost::mutex::<span class="function">scoped_lock <span class="title">lock</span><span class="params">(cloud_mutex_)</span></span>;</span><br><span class="line">    cloud_msg_ = cloud;</span><br><span class="line">    cloud_condition_.notify_all();</span><br><span class="line">  }</span><br><span class="line">  <span class="function"><span class="keyword">bool</span> <span class="title">detect_wall</span> <span class="params">(stereo_wall_detection::DetectWall::Request &amp;req, stereo_wall_detection::DetectWall::Response &amp;resp)</span></span><br><span class="line">  </span>{</span><br><span class="line">    ros::Time start_time = ros::Time::now();</span><br><span class="line"></span><br><span class="line">    <span class="comment">// wait for new pointcloud</span></span><br><span class="line">    boost::mutex::<span class="function">scoped_lock <span class="title">lock</span><span class="params">(cloud_mutex_)</span></span>;</span><br><span class="line">    cloud_condition_.wait(lock);</span><br><span class="line">    <span class="comment">//......</span></span><br><span class="line">  }</span><br><span class="line">  <span class="function"><span class="keyword">int</span> <span class="title">main</span> <span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span>** argv)</span></span><br><span class="line"></span>{</span><br><span class="line">  ros::init (argc, argv, <span class="string">&quot;wall_extractor&quot;</span>);</span><br><span class="line"></span><br><span class="line">  PlanarFit p;</span><br><span class="line">  ros::<span class="function">MultiThreadedSpinner <span class="title">spinner</span><span class="params">(<span class="number">2</span>)</span></span>;  <span class="comment">// extra thread so we can receive cloud messages while in the service call</span></span><br><span class="line">  spinner.spin();</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> (<span class="number">0</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="&#x5E16;&#x5B50;&#x7B54;&#x6848;"><a href="#&#x5E16;&#x5B50;&#x7B54;&#x6848;" class="headerlink" title="&#x5E16;&#x5B50;&#x7B54;&#x6848;"></a>&#x5E16;&#x5B50;&#x7B54;&#x6848;</h3><ul>
<li>Briefly: It won&#x2019;t work as you expect and you probably do not need such a complex way of designing your node.</li>
</ul>
<h4 id="the-theory"><a href="#The-theory" class="headerlink" title="The theory"></a>The theory</h4><ul>
<li><p>When it comes to communication in roscpp, two kind of objects are handling callbacks:<br>callback queuesspinnersA spinner is an object that has the ability to call the callbacks contained in a callback queue. A callback queue is the object in which each subscriber will add an element each time a message is received by resolving which kind of message should call which callbacks (and with which arguments).</p>
</li>
<li><p>Regarding the spinners, there is currently three implementations available in roscpp:<br>Single thread spinner: the default one, takes the messages contained in a callback queue and process the callbacks one by one while blocking the execution of the thread that called it.Multi-threaded spinner: spawns a couple of threads (configurable) that will execute callbacks in parallel when messages are received but blocks the execution of the thread that called it.Asynchronous spinner: spawns a couple of threads (configurable) that will execute callbacks in parallel while not blocking the thread that called it. The start/stop method allows to control when the callbacks start being processed and when it should stop.These objects may be instantiated manually in advanced ROS nodes but to avoid verbose initialization, analternative, object-less, API is provided through functions in the ROS namespace. Aka ros::spin(),ros::spinOnce() and so on. This API rely on a default callback queue implemented as a singleton which is accessible through the ros::getGlobalCallbackQueue() function.</p>
</li>
<li><p>So basically when you call the ros::spinOnce() function, a single-thread spinner is created and its spin method is called once using the default callback queue (see init.cpp from roscpp).</p>
</li>
<li><p>And to finish, when you create a Subscriber, you pass it a NodeHandle and each NodeHandle has an associated callbackqueue that default to the global one but which can be overridden using thegetCallbackQueue/setCallbackQueue methods.</p>
</li>
</ul>
<h4 id="your-case"><a href="#Your-case" class="headerlink" title="Your case"></a>Your case</h4><ul>
<li>If you take a look at spinner.cpp you will see there is a mutex that make the SingleThreader thread-safe whilediscouraging you to use it in this case (line 48).</li>
</ul>
<h4 id="conclusion"><a href="#Conclusion" class="headerlink" title="Conclusion"></a>Conclusion</h4><ul>
<li>what you do is safe but will trigger regularly ROS error messages as there is chances that several instances of ros::SpinOnce will be executed in parallel.</li>
</ul>
<h4 id="proposed-solution"><a href="#Proposed-solution" class="headerlink" title="Proposed solution"></a>Proposed solution</h4><ul>
<li>Considering your applications, I think your callbacks are just not written as they should. A callback should stay as simple and fast as possible. In most of the cases, a callback is just feeding ROS data to your own classes which is usually as simple as copying data (and maybe converting them). It will help you ensuring that your callbacks are thread-safe (if you want to convert your node to a nodelet for instance, one day) and avoid making &#x201C;ros::Spin&#x201D; blocking for a long time, even in the case you are using the single-threaded spinner.</li>
<li>Typically, if you want to do time-consuming computations such as &#x201C;leg detection&#x201D;, the callbacks are definitively not the place to do it.</li>
<li>Just, copy your data to a LegDetector object instance and call in your main thread the method that will do the heavy work. In particular here, you really don&#x2019;t care about losing old messages if your node is not fast enough so there is really no reason to pay the extra-burden of all the multi-thread infrastructure. Use Boost.Bind for instance, to pass a reference to your LegDetector class to the callback that will just copy the relevant laser data into it.</li>
<li>If, at some point, you need to synchronise the received data, use the message_filters API. In this case again, trying to use multi-thread to do so is definitively a bad idea.</li>
</ul>

      

      
        <div class="page-reward">
          <a href="javascript:;" class="page-reward-btn tooltip-top">
            <div class="tooltip tooltip-east">
            <span class="tooltip-item">
              赏
            </span>
            <span class="tooltip-content">
              <span class="tooltip-text">
                <span class="tooltip-inner">
                  <p class="reward-p"><i class="icon icon-quo-left"></i>谢谢你请我吃糖果<i class="icon icon-quo-right"></i></p>
                  <div class="reward-box">
                    
                    <div class="reward-box-item">
                      <img class="reward-img" src="http://7xvunf.com1.z0.glb.clouddn.com/alipay.jpg">
                      <span class="reward-type">支付宝</span>
                    </div>
                    
                    
                    <div class="reward-box-item">
                      <img class="reward-img" src="http://7xvunf.com1.z0.glb.clouddn.com/wechatpay.jpg">
                      <span class="reward-type">微信</span>
                    </div>
                    
                  </div>
                </span>
              </span>
            </span>
          </div>
          </a>
        </div>
      
    </div>
    <div class="article-info article-info-index">
      
      
	<div class="article-tag tagcloud">
		<i class="icon-price-tags"></i>
		<ul class="article-tag-list">
			 
        <li class="article-tag-list-item">
        	<a href="javascript:void(0)" class="article-tag-list-link color4">机器人</a>
        </li>
       
        <li class="article-tag-list-item">
        	<a href="javascript:void(0)" class="article-tag-list-link color3">机器人软件设计</a>
        </li>
       
        <li class="article-tag-list-item">
        	<a href="javascript:void(0)" class="article-tag-list-link color4">ROS</a>
        </li>
      
		</ul>
	</div>

      

      

      
        
<div class="share-btn share-icons tooltip-left">
  <div class="tooltip tooltip-east">
    <span class="tooltip-item">
      <a href="javascript:;" class="share-sns share-outer">
        <i class="icon icon-share"></i>
      </a>
    </span>
    <span class="tooltip-content">
      <div class="share-wrap">
        <div class="share-icons">
          <a class="weibo share-sns" href="javascript:;" data-type="weibo">
            <i class="icon icon-weibo"></i>
          </a>
          <a class="weixin share-sns wxFab" href="javascript:;" data-type="weixin">
            <i class="icon icon-weixin"></i>
          </a>
          <a class="qq share-sns" href="javascript:;" data-type="qq">
            <i class="icon icon-qq"></i>
          </a>
          <a class="douban share-sns" href="javascript:;" data-type="douban">
            <i class="icon icon-douban"></i>
          </a>
          <a class="qzone share-sns" href="javascript:;" data-type="qzone">
            <i class="icon icon-qzone"></i>
          </a>
          <a class="facebook share-sns" href="javascript:;" data-type="facebook">
            <i class="icon icon-facebook"></i>
          </a>
          <a class="twitter share-sns" href="javascript:;" data-type="twitter">
            <i class="icon icon-twitter"></i>
          </a>
          <a class="google share-sns" href="javascript:;" data-type="google">
            <i class="icon icon-google"></i>
          </a>
        </div>
      </div>
    </span>
  </div>
</div>

<div class="page-modal wx-share js-wx-box">
    <a class="close js-modal-close" href="javascript:;"><i class="icon icon-close"></i></a>
    <p>扫一扫，分享到微信</p>
    <div class="wx-qrcode">
      <img src="http://s.jiathis.com/qrcode.php?url=https://ZhenshengLee.github.io/2017/01/03/170103-ROSCpp/" alt="微信分享二维码">
    </div>
</div>

<div class="mask js-mask"></div>
      
      <div class="clearfix"></div>
    </div>
  </div>
</article>

  
<nav id="article-nav">
  
    <a href="/2017/01/03/170103-ROSBridgeSuit/" id="article-nav-newer" class="article-nav-link-wrap">
      <i class="icon-circle-left"></i>
      <div class="article-nav-title">
        
          ROSBridgeSuit
        
      </div>
    </a>
  
  
    <a href="/2017/01/03/170103-ROS多机配置/" id="article-nav-older" class="article-nav-link-wrap">
      <div class="article-nav-title">ROS多机配置</div>
      <i class="icon-circle-right"></i>
    </a>
  
</nav>






  
  <div class="duoshuo">
	<!-- 多说评论框 start -->
	<div class="ds-thread" data-thread-key="170103-ROSCpp" data-title="ROSCpp-ROS线程模型" data-url="https://ZhenshengLee.github.io/2017/01/03/170103-ROSCpp/"></div>
	<!-- 多说评论框 end -->
	<!-- 多说公共JS代码 start (一个网页只需插入一次) -->
	<script type="text/javascript">
	var duoshuoQuery = {short_name:"true"};
	(function() {
		var ds = document.createElement('script');
		ds.type = 'text/javascript';ds.async = true;
		ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
		ds.charset = 'UTF-8';
		(document.getElementsByTagName('head')[0] 
		 || document.getElementsByTagName('body')[0]).appendChild(ds);
	})();
	</script>
	<!-- 多说公共JS代码 end -->
</div>

  




          </div>
        </div>
      </div>
      <footer id="footer">
  <div class="outer">
    <div id="footer-info">
    	<div class="footer-left">
    		&copy; 2017 黎振胜
    	</div>
      	<div class="footer-right">
      		<a href="http://hexo.io/" target="_blank">Hexo</a>  Theme <a href="https://github.com/litten/hexo-theme-yilia" target="_blank">Yilia</a> by Litten
      	</div>
    </div>
  </div>
</footer>
    </div>
    <script>
	var yiliaConfig = {
		mathjax: true,
		isHome: false,
		isPost: true,
		isArchive: false,
		isTag: false,
		isCategory: false,
		open_in_new: false,
		root: "/",
		innerArchive: true,
		showTags: false
	}
</script>

<script>
!function(t){function n(r){if(e[r])return e[r].exports;var o=e[r]={exports:{},id:r,loaded:!1};return t[r].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var e={};return n.m=t,n.c=e,n.p="/",n(0)}([function(t,n,e){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function o(t,n){var e=/\/|index.html/g;return t.replace(e,"")===n.replace(e,"")}function i(){for(var t=document.querySelectorAll(".js-header-menu li a"),n=window.location.pathname,e=0,r=t.length;e<r;e++){var i=t[e];o(n,i.getAttribute("href"))&&(0,d.default)(i,"active")}}function u(t){for(var n=t.offsetLeft,e=t.offsetParent;null!==e;)n+=e.offsetLeft,e=e.offsetParent;return n}function f(t){for(var n=t.offsetTop,e=t.offsetParent;null!==e;)n+=e.offsetTop,e=e.offsetParent;return n}function c(t,n,e,r,o){var i=u(t),c=f(t)-n;if(c-e<=o){var a=t.$newDom;a||(a=t.cloneNode(!0),(0,h.default)(t,a),t.$newDom=a,a.style.position="fixed",a.style.top=(e||c)+"px",a.style.left=i+"px",a.style.zIndex=r||2,a.style.width="100%",a.style.color="#fff"),a.style.visibility="visible",t.style.visibility="hidden"}else{t.style.visibility="visible";var s=t.$newDom;s&&(s.style.visibility="hidden")}}function a(){var t=document.querySelector(".js-overlay"),n=document.querySelector(".js-header-menu");c(t,document.body.scrollTop,-63,2,0),c(n,document.body.scrollTop,1,3,0)}function s(){document.querySelector("#container").addEventListener("scroll",function(t){a()}),window.addEventListener("scroll",function(t){a()}),a()}function l(){x.default.versions.mobile&&window.screen.width<800&&(i(),s())}var p=e(71),d=r(p),v=e(72),y=(r(v),e(84)),h=r(y),b=e(69),x=r(b),m=e(75),g=r(m),w=e(70);l(),(0,w.addLoadEvent)(function(){g.default.init()}),t.exports={}},function(t,n){var e=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=e)},function(t,n){var e={}.hasOwnProperty;t.exports=function(t,n){return e.call(t,n)}},function(t,n,e){var r=e(49),o=e(15);t.exports=function(t){return r(o(t))}},function(t,n,e){t.exports=!e(8)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,n,e){var r=e(6),o=e(12);t.exports=e(4)?function(t,n,e){return r.f(t,n,o(1,e))}:function(t,n,e){return t[n]=e,t}},function(t,n,e){var r=e(10),o=e(30),i=e(24),u=Object.defineProperty;n.f=e(4)?Object.defineProperty:function(t,n,e){if(r(t),n=i(n,!0),r(e),o)try{return u(t,n,e)}catch(t){}if("get"in e||"set"in e)throw TypeError("Accessors not supported!");return"value"in e&&(t[n]=e.value),t}},function(t,n,e){var r=e(22)("wks"),o=e(13),i=e(1).Symbol,u="function"==typeof i,f=t.exports=function(t){return r[t]||(r[t]=u&&i[t]||(u?i:o)("Symbol."+t))};f.store=r},function(t,n){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,n,e){var r=e(35),o=e(16);t.exports=Object.keys||function(t){return r(t,o)}},function(t,n,e){var r=e(11);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n){var e=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++e+r).toString(36))}},function(t,n){var e=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=e)},function(t,n){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on  "+t);return t}},function(t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,n){t.exports={}},function(t,n){t.exports=!0},function(t,n){n.f={}.propertyIsEnumerable},function(t,n,e){var r=e(6).f,o=e(2),i=e(7)("toStringTag");t.exports=function(t,n,e){t&&!o(t=e?t:t.prototype,i)&&r(t,i,{configurable:!0,value:n})}},function(t,n,e){var r=e(22)("keys"),o=e(13);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,n,e){var r=e(1),o="__core-js_shared__",i=r[o]||(r[o]={});t.exports=function(t){return i[t]||(i[t]={})}},function(t,n){var e=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:e)(t)}},function(t,n,e){var r=e(11);t.exports=function(t,n){if(!r(t))return t;var e,o;if(n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;if("function"==typeof(e=t.valueOf)&&!r(o=e.call(t)))return o;if(!n&&"function"==typeof(e=t.toString)&&!r(o=e.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,n,e){var r=e(1),o=e(14),i=e(18),u=e(26),f=e(6).f;t.exports=function(t){var n=o.Symbol||(o.Symbol=i?{}:r.Symbol||{});"_"==t.charAt(0)||t in n||f(n,t,{value:u.f(t)})}},function(t,n,e){n.f=e(7)},function(t,n,e){var r=e(1),o=e(14),i=e(46),u=e(5),f="prototype",c=function(t,n,e){var a,s,l,p=t&c.F,d=t&c.G,v=t&c.S,y=t&c.P,h=t&c.B,b=t&c.W,x=d?o:o[n]||(o[n]={}),m=x[f],g=d?r:v?r[n]:(r[n]||{})[f];d&&(e=n);for(a in e)s=!p&&g&&void 0!==g[a],s&&a in x||(l=s?g[a]:e[a],x[a]=d&&"function"!=typeof g[a]?e[a]:h&&s?i(l,r):b&&g[a]==l?function(t){var n=function(n,e,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(n);case 2:return new t(n,e)}return new t(n,e,r)}return t.apply(this,arguments)};return n[f]=t[f],n}(l):y&&"function"==typeof l?i(Function.call,l):l,y&&((x.virtual||(x.virtual={}))[a]=l,t&c.R&&m&&!m[a]&&u(m,a,l)))};c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,c.U=64,c.R=128,t.exports=c},function(t,n){var e={}.toString;t.exports=function(t){return e.call(t).slice(8,-1)}},function(t,n,e){var r=e(11),o=e(1).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,n,e){t.exports=!e(4)&&!e(8)(function(){return 7!=Object.defineProperty(e(29)("div"),"a",{get:function(){return 7}}).a})},function(t,n,e){"use strict";var r=e(18),o=e(27),i=e(36),u=e(5),f=e(2),c=e(17),a=e(51),s=e(20),l=e(58),p=e(7)("iterator"),d=!([].keys&&"next"in[].keys()),v="@@iterator",y="keys",h="values",b=function(){return this};t.exports=function(t,n,e,x,m,g,w){a(e,n,x);var O,S,_,j=function(t){if(!d&&t in A)return A[t];switch(t){case y:return function(){return new e(this,t)};case h:return function(){return new e(this,t)}}return function(){return new e(this,t)}},P=n+" Iterator",E=m==h,M=!1,A=t.prototype,T=A[p]||A[v]||m&&A[m],L=T||j(m),N=m?E?j("entries"):L:void 0,C="Array"==n?A.entries||T:T;if(C&&(_=l(C.call(new t)),_!==Object.prototype&&(s(_,P,!0),r||f(_,p)||u(_,p,b))),E&&T&&T.name!==h&&(M=!0,L=function(){return T.call(this)}),r&&!w||!d&&!M&&A[p]||u(A,p,L),c[n]=L,c[P]=b,m)if(O={values:E?L:j(h),keys:g?L:j(y),entries:N},w)for(S in O)S in A||i(A,S,O[S]);else o(o.P+o.F*(d||M),n,O);return O}},function(t,n,e){var r=e(10),o=e(55),i=e(16),u=e(21)("IE_PROTO"),f=function(){},c="prototype",a=function(){var t,n=e(29)("iframe"),r=i.length,o="<",u=">";for(n.style.display="none",e(48).appendChild(n),n.src="javascript:",t=n.contentWindow.document,t.open(),t.write(o+"script"+u+"document.F=Object"+o+"/script"+u),t.close(),a=t.F;r--;)delete a[c][i[r]];return a()};t.exports=Object.create||function(t,n){var e;return null!==t?(f[c]=r(t),e=new f,f[c]=null,e[u]=t):e=a(),void 0===n?e:o(e,n)}},function(t,n,e){var r=e(35),o=e(16).concat("length","prototype");n.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,e){var r=e(2),o=e(3),i=e(45)(!1),u=e(21)("IE_PROTO");t.exports=function(t,n){var e,f=o(t),c=0,a=[];for(e in f)e!=u&&r(f,e)&&a.push(e);for(;n.length>c;)r(f,e=n[c++])&&(~i(a,e)||a.push(e));return a}},function(t,n,e){t.exports=e(5)},function(t,n,e){var r=e(15);t.exports=function(t){return Object(r(t))}},function(t,n,e){t.exports={default:e(41),__esModule:!0}},function(t,n,e){t.exports={default:e(42),__esModule:!0}},function(t,n,e){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}n.__esModule=!0;var o=e(39),i=r(o),u=e(38),f=r(u),c="function"==typeof f.default&&"symbol"==typeof i.default?function(t){return typeof t}:function(t){return t&&"function"==typeof f.default&&t.constructor===f.default&&t!==f.default.prototype?"symbol":typeof t};n.default="function"==typeof f.default&&"symbol"===c(i.default)?function(t){return"undefined"==typeof t?"undefined":c(t)}:function(t){return t&&"function"==typeof f.default&&t.constructor===f.default&&t!==f.default.prototype?"symbol":"undefined"==typeof t?"undefined":c(t)}},function(t,n,e){e(65),e(63),e(66),e(67),t.exports=e(14).Symbol},function(t,n,e){e(64),e(68),t.exports=e(26).f("iterator")},function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,n){t.exports=function(){}},function(t,n,e){var r=e(3),o=e(61),i=e(60);t.exports=function(t){return function(n,e,u){var f,c=r(n),a=o(c.length),s=i(u,a);if(t&&e!=e){for(;a>s;)if(f=c[s++],f!=f)return!0}else for(;a>s;s++)if((t||s in c)&&c[s]===e)return t||s||0;return!t&&-1}}},function(t,n,e){var r=e(43);t.exports=function(t,n,e){if(r(t),void 0===n)return t;switch(e){case 1:return function(e){return t.call(n,e)};case 2:return function(e,r){return t.call(n,e,r)};case 3:return function(e,r,o){return t.call(n,e,r,o)}}return function(){return t.apply(n,arguments)}}},function(t,n,e){var r=e(9),o=e(34),i=e(19);t.exports=function(t){var n=r(t),e=o.f;if(e)for(var u,f=e(t),c=i.f,a=0;f.length>a;)c.call(t,u=f[a++])&&n.push(u);return n}},function(t,n,e){t.exports=e(1).document&&document.documentElement},function(t,n,e){var r=e(28);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,n,e){var r=e(28);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,n,e){"use strict";var r=e(32),o=e(12),i=e(20),u={};e(5)(u,e(7)("iterator"),function(){return this}),t.exports=function(t,n,e){t.prototype=r(u,{next:o(1,e)}),i(t,n+" Iterator")}},function(t,n){t.exports=function(t,n){return{value:n,done:!!t}}},function(t,n,e){var r=e(9),o=e(3);t.exports=function(t,n){for(var e,i=o(t),u=r(i),f=u.length,c=0;f>c;)if(i[e=u[c++]]===n)return e}},function(t,n,e){var r=e(13)("meta"),o=e(11),i=e(2),u=e(6).f,f=0,c=Object.isExtensible||function(){return!0},a=!e(8)(function(){return c(Object.preventExtensions({}))}),s=function(t){u(t,r,{value:{i:"O"+ ++f,w:{}}})},l=function(t,n){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!c(t))return"F";if(!n)return"E";s(t)}return t[r].i},p=function(t,n){if(!i(t,r)){if(!c(t))return!0;if(!n)return!1;s(t)}return t[r].w},d=function(t){return a&&v.NEED&&c(t)&&!i(t,r)&&s(t),t},v=t.exports={KEY:r,NEED:!1,fastKey:l,getWeak:p,onFreeze:d}},function(t,n,e){var r=e(6),o=e(10),i=e(9);t.exports=e(4)?Object.defineProperties:function(t,n){o(t);for(var e,u=i(n),f=u.length,c=0;f>c;)r.f(t,e=u[c++],n[e]);return t}},function(t,n,e){var r=e(19),o=e(12),i=e(3),u=e(24),f=e(2),c=e(30),a=Object.getOwnPropertyDescriptor;n.f=e(4)?a:function(t,n){if(t=i(t),n=u(n,!0),c)try{return a(t,n)}catch(t){}if(f(t,n))return o(!r.f.call(t,n),t[n])}},function(t,n,e){var r=e(3),o=e(33).f,i={}.toString,u="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],f=function(t){try{return o(t)}catch(t){return u.slice()}};t.exports.f=function(t){return u&&"[object Window]"==i.call(t)?f(t):o(r(t))}},function(t,n,e){var r=e(2),o=e(37),i=e(21)("IE_PROTO"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=o(t),r(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,n,e){var r=e(23),o=e(15);t.exports=function(t){return function(n,e){var i,u,f=String(o(n)),c=r(e),a=f.length;return c<0||c>=a?t?"":void 0:(i=f.charCodeAt(c),i<55296||i>56319||c+1===a||(u=f.charCodeAt(c+1))<56320||u>57343?t?f.charAt(c):i:t?f.slice(c,c+2):(i-55296<<10)+(u-56320)+65536)}}},function(t,n,e){var r=e(23),o=Math.max,i=Math.min;t.exports=function(t,n){return t=r(t),t<0?o(t+n,0):i(t,n)}},function(t,n,e){var r=e(23),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,n,e){"use strict";var r=e(44),o=e(52),i=e(17),u=e(3);t.exports=e(31)(Array,"Array",function(t,n){this._t=u(t),this._i=0,this._k=n},function(){var t=this._t,n=this._k,e=this._i++;return!t||e>=t.length?(this._t=void 0,o(1)):"keys"==n?o(0,e):"values"==n?o(0,t[e]):o(0,[e,t[e]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(t,n){},function(t,n,e){"use strict";var r=e(59)(!0);e(31)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,n=this._t,e=this._i;return e>=n.length?{value:void 0,done:!0}:(t=r(n,e),this._i+=t.length,{value:t,done:!1})})},function(t,n,e){"use strict";var r=e(1),o=e(2),i=e(4),u=e(27),f=e(36),c=e(54).KEY,a=e(8),s=e(22),l=e(20),p=e(13),d=e(7),v=e(26),y=e(25),h=e(53),b=e(47),x=e(50),m=e(10),g=e(3),w=e(24),O=e(12),S=e(32),_=e(57),j=e(56),P=e(6),E=e(9),M=j.f,A=P.f,T=_.f,L=r.Symbol,N=r.JSON,C=N&&N.stringify,k="prototype",F=d("_hidden"),q=d("toPrimitive"),I={}.propertyIsEnumerable,B=s("symbol-registry"),D=s("symbols"),W=s("op-symbols"),H=Object[k],K="function"==typeof L,R=r.QObject,J=!R||!R[k]||!R[k].findChild,U=i&&a(function(){return 7!=S(A({},"a",{get:function(){return A(this,"a",{value:7}).a}})).a})?function(t,n,e){var r=M(H,n);r&&delete H[n],A(t,n,e),r&&t!==H&&A(H,n,r)}:A,G=function(t){var n=D[t]=S(L[k]);return n._k=t,n},$=K&&"symbol"==typeof L.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof L},z=function(t,n,e){return t===H&&z(W,n,e),m(t),n=w(n,!0),m(e),o(D,n)?(e.enumerable?(o(t,F)&&t[F][n]&&(t[F][n]=!1),e=S(e,{enumerable:O(0,!1)})):(o(t,F)||A(t,F,O(1,{})),t[F][n]=!0),U(t,n,e)):A(t,n,e)},Y=function(t,n){m(t);for(var e,r=b(n=g(n)),o=0,i=r.length;i>o;)z(t,e=r[o++],n[e]);return t},Q=function(t,n){return void 0===n?S(t):Y(S(t),n)},X=function(t){var n=I.call(this,t=w(t,!0));return!(this===H&&o(D,t)&&!o(W,t))&&(!(n||!o(this,t)||!o(D,t)||o(this,F)&&this[F][t])||n)},V=function(t,n){if(t=g(t),n=w(n,!0),t!==H||!o(D,n)||o(W,n)){var e=M(t,n);return!e||!o(D,n)||o(t,F)&&t[F][n]||(e.enumerable=!0),e}},Z=function(t){for(var n,e=T(g(t)),r=[],i=0;e.length>i;)o(D,n=e[i++])||n==F||n==c||r.push(n);return r},tt=function(t){for(var n,e=t===H,r=T(e?W:g(t)),i=[],u=0;r.length>u;)!o(D,n=r[u++])||e&&!o(H,n)||i.push(D[n]);return i};K||(L=function(){if(this instanceof L)throw TypeError("Symbol is not a constructor!");var t=p(arguments.length>0?arguments[0]:void 0),n=function(e){this===H&&n.call(W,e),o(this,F)&&o(this[F],t)&&(this[F][t]=!1),U(this,t,O(1,e))};return i&&J&&U(H,t,{configurable:!0,set:n}),G(t)},f(L[k],"toString",function(){return this._k}),j.f=V,P.f=z,e(33).f=_.f=Z,e(19).f=X,e(34).f=tt,i&&!e(18)&&f(H,"propertyIsEnumerable",X,!0),v.f=function(t){return G(d(t))}),u(u.G+u.W+u.F*!K,{Symbol:L});for(var nt="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),et=0;nt.length>et;)d(nt[et++]);for(var nt=E(d.store),et=0;nt.length>et;)y(nt[et++]);u(u.S+u.F*!K,"Symbol",{for:function(t){return o(B,t+="")?B[t]:B[t]=L(t)},keyFor:function(t){if($(t))return h(B,t);throw TypeError(t+" is not a symbol!")},useSetter:function(){J=!0},useSimple:function(){J=!1}}),u(u.S+u.F*!K,"Object",{create:Q,defineProperty:z,defineProperties:Y,getOwnPropertyDescriptor:V,getOwnPropertyNames:Z,getOwnPropertySymbols:tt}),N&&u(u.S+u.F*(!K||a(function(){var t=L();return"[null]"!=C([t])||"{}"!=C({a:t})||"{}"!=C(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!$(t)){for(var n,e,r=[t],o=1;arguments.length>o;)r.push(arguments[o++]);return n=r[1],"function"==typeof n&&(e=n),!e&&x(n)||(n=function(t,n){if(e&&(n=e.call(this,t,n)),!$(n))return n}),r[1]=n,C.apply(N,r)}}}),L[k][q]||e(5)(L[k],q,L[k].valueOf),l(L,"Symbol"),l(Math,"Math",!0),l(r.JSON,"JSON",!0)},function(t,n,e){e(25)("asyncIterator")},function(t,n,e){e(25)("observable")},function(t,n,e){e(62);for(var r=e(1),o=e(5),i=e(17),u=e(7)("toStringTag"),f=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],c=0;c<5;c++){var a=f[c],s=r[a],l=s&&s.prototype;l&&!l[u]&&o(l,u,a),i[a]=i.Array}},function(t,n){"use strict";var e={versions:function(){var t=window.navigator.userAgent;return{trident:t.indexOf("Trident")>-1,presto:t.indexOf("Presto")>-1,webKit:t.indexOf("AppleWebKit")>-1,gecko:t.indexOf("Gecko")>-1&&t.indexOf("KHTML")==-1,mobile:!!t.match(/AppleWebKit.*Mobile.*/),ios:!!t.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),android:t.indexOf("Android")>-1||t.indexOf("Linux")>-1,iPhone:t.indexOf("iPhone")>-1||t.indexOf("Mac")>-1,iPad:t.indexOf("iPad")>-1,webApp:t.indexOf("Safari")==-1,weixin:t.indexOf("MicroMessenger")==-1}}()};t.exports=e},function(t,n,e){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}var o=e(40),i=r(o),u=function(){function t(t,n,e){return n||e?String.fromCharCode(n||e):o[t]||t}function n(t){return l[t]}var e=/&quot;|&lt;|&gt;|&amp;|&nbsp;|&apos;|&#(\d+);|&#(\d+)/g,r=/['<> "&]/g,o={"&quot;":'"',"&lt;":"<","&gt;":">","&amp;":"&","&nbsp;":" "},f=/\u00a0/g,c=/<br\s*\/?>/gi,a=/\r?\n/g,s=/\s/g,l={};for(var p in o)l[o[p]]=p;return o["&apos;"]="'",l["'"]="&#39;",{encode:function(t){return t?(""+t).replace(r,n).replace(a,"<br/>").replace(s,"&nbsp;"):""},decode:function(n){return n?(""+n).replace(c,"\n").replace(e,t).replace(f," "):""},encodeBase16:function(t){if(!t)return t;t+="";for(var n=[],e=0,r=t.length;r>e;e++)n.push(t.charCodeAt(e).toString(16).toUpperCase());return n.join("")},encodeBase16forJSON:function(t){if(!t)return t;t=t.replace(/[\u4E00-\u9FBF]/gi,function(t){return escape(t).replace("%u","\\u")});for(var n=[],e=0,r=t.length;r>e;e++)n.push(t.charCodeAt(e).toString(16).toUpperCase());return n.join("")},decodeBase16:function(t){if(!t)return t;t+="";for(var n=[],e=0,r=t.length;r>e;e+=2)n.push(String.fromCharCode("0x"+t.slice(e,e+2)));return n.join("")},encodeObject:function(t){if(t instanceof Array)for(var n=0,e=t.length;e>n;n++)t[n]=u.encodeObject(t[n]);else if("object"==("undefined"==typeof t?"undefined":(0,i.default)(t)))for(var r in t)t[r]=u.encodeObject(t[r]);else if("string"==typeof t)return u.encode(t);return t},loadScript:function(t){var n=document.createElement("script");document.getElementsByTagName("body")[0].appendChild(n),n.setAttribute("src",t)},addLoadEvent:function(t){var n=window.onload;"function"!=typeof window.onload?window.onload=t:window.onload=function(){n(),t()}}}}();t.exports=u},function(t,n){function e(t,n){t.classList?t.classList.add(n):t.className+=" "+n}t.exports=e},function(t,n){function e(t,n){if(t.classList)t.classList.remove(n);else{var e=new RegExp("(^|\\b)"+n.split(" ").join("|")+"(\\b|$)","gi");t.className=t.className.replace(e," ")}}t.exports=e},,,function(t,n){"use strict";function e(){var t=document.querySelector("#page-nav");if(t&&!document.querySelector("#page-nav .extend.prev")&&(t.innerHTML='<a class="extend prev disabled" rel="prev">&laquo; Prev</a>'+t.innerHTML),t&&!document.querySelector("#page-nav .extend.next")&&(t.innerHTML=t.innerHTML+'<a class="extend next disabled" rel="next">Next &raquo;</a>'),yiliaConfig&&yiliaConfig.open_in_new){var n=document.querySelectorAll(".article-entry a:not(.article-more-a)");n.forEach(function(t){t.setAttribute("target","_blank")})}var e=document.querySelector("#js-aboutme");e&&0!==e.length&&(e.innerHTML=e.innerText)}t.exports={init:e}},,,,,,,,,function(t,n){function e(t,n){if("string"==typeof n)return t.insertAdjacentHTML("afterend",n);var e=t.nextSibling;return e?t.parentNode.insertBefore(n,e):t.parentNode.appendChild(n)}t.exports=e}]);
</script>
<script src="/main.68ab53.js"></script>
<script>
(function() {
	var loadScript = function(path) {
	    var $script = document.createElement('script')
	    document.getElementsByTagName('body')[0].appendChild($script)
	    $script.setAttribute('src', path)
	}
	loadScript("/slider.fa3fc2.js")
})();
</script>




<script type="text/x-mathjax-config">
MathJax.Hub.Config({
    tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
        processEscapes: true,
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
    }
});

MathJax.Hub.Queue(function() {
    var all = MathJax.Hub.getAllJax(), i;
    for(i=0; i < all.length; i += 1) {
        all[i].SourceElement().parentNode.className += ' has-jax';                 
    }       
});
</script>

<script src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>


    
<div class="tools-col" q-class="show:isShow,hide:isShow|isFalse" q-on="click:stop(e)">
  <div class="tools-nav header-menu">
    
    
      
      
      
    
      
    
      
      
      
    
    

    <ul style="width: 70%">
    
    
      
      <li style="width: 50%" q-on="click: openSlider(e, 'innerArchive')"><a href="javascript:void(0)" q-class="active:innerArchive">所有文章</a></li>
      
        
      
        
      
      <li style="width: 50%" q-on="click: openSlider(e, 'aboutme')"><a href="javascript:void(0)" q-class="active:aboutme">关于我</a></li>
      
        
    </ul>
  </div>
  <div class="tools-wrap">
    
    	<section class="tools-section tools-section-all" q-show="innerArchive">
        <div class="search-wrap">
          <input class="search-ipt" q-model="search" type="text" placeholder="find something…">
          <i class="icon-search icon" q-show="search|isEmptyStr"></i>
          <i class="icon-close icon" q-show="search|isNotEmptyStr" q-on="click:clearChose(e)"></i>
        </div>
        <div class="widget tagcloud search-tag">
          <p class="search-tag-wording">tag:</p>
          <label class="search-switch">
            <input type="checkbox" q-on="click:toggleTag(e)" q-attr="checked:showTags">
          </label>
          <ul class="article-tag-list" q-show="showTags">
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">机器人软件构造</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color4">机器人</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">部署</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color4">git</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">其他</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">建站</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color2">Ubuntu</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">机器人软件设计</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">论文</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color4">ROS</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">编译</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">调试</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">机器人系统开发</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color4">编辑器</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">组件</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color5">ompl</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color5">深度学习</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color1">caffe</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color4">卷首语</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color3">整机</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color2">库</a>
              </li>
             
              <li class="article-tag-list-item">
                <a href="javascript:void(0)" class="color5">建模文档</a>
              </li>
            
            <div class="clearfix"></div>
          </ul>
        </div>
        <ul class="search-ul">
          <p q-show="jsonFail" style="padding: 20px; font-size: 12px;">
            缺失模块。<br/>1、在博客根目录（注意不是yilia根目录）执行以下命令：<br/> npm i hexo-generator-json-content --save<br/><br/>
            2、在根目录_config.yml里添加配置：
<pre style="font-size: 12px;" q-show="jsonFail">
  jsonContent:
    meta: false
    pages: false
    posts:
      title: true
      date: true
      path: true
      text: true
      raw: false
      content: false
      slug: false
      updated: false
      comments: false
      link: false
      permalink: false
      excerpt: false
      categories: false
      tags: true
</pre>
          </p>
          <li class="search-li" q-repeat="items" q-show="isShow">
            <a q-attr="href:path|urlformat" class="search-title"><i class="icon-quo-left icon"></i><span q-text="title"></span></a>
            <p class="search-time">
              <i class="icon-calendar icon"></i>
              <span q-text="date|dateformat"></span>
            </p>
            <p class="search-tag">
              <i class="icon-price-tags icon"></i>
              <span q-repeat="tags" q-on="click:choseTag(e, name)" q-text="name|tagformat"></span>
            </p>
          </li>
        </ul>
    	</section>
    

    

    
    	<section class="tools-section tools-section-me" q-show="aboutme">
  	  	
  	  		<div class="aboutme-wrap" id="js-aboutme">本科学机械，硕士程序员，读书在中南，工作在中兴。</div>
  	  	
    	</section>
    
  </div>
  
</div>
    <!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

    <!-- Background of PhotoSwipe. 
         It's a separate element as animating opacity is faster than rgba(). -->
    <div class="pswp__bg"></div>

    <!-- Slides wrapper with overflow:hidden. -->
    <div class="pswp__scroll-wrap">

        <!-- Container that holds slides. 
            PhotoSwipe keeps only 3 of them in the DOM to save memory.
            Don't modify these 3 pswp__item elements, data is added later on. -->
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>

        <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
        <div class="pswp__ui pswp__ui--hidden">

            <div class="pswp__top-bar">

                <!--  Controls are self-explanatory. Order can be changed. -->

                <div class="pswp__counter"></div>

                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

                <button class="pswp__button pswp__button--share" style="display:none" title="Share"></button>

                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

                <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
                <!-- element will get class pswp__preloader--active when preloader is running -->
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                      <div class="pswp__preloader__cut">
                        <div class="pswp__preloader__donut"></div>
                      </div>
                    </div>
                </div>
            </div>

            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div> 
            </div>

            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>

            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>

        </div>

    </div>

</div>
  </div>
</body>
</html>